#!/bin/bash
set -e  # 遇到错误立即退出

# 配置参数
APP_NAME="go-caipu"
# 建议 非root用户
APP_USER="caipu"
APP_GROUP="caipu"
APP_PATH="/app"
APP_BIN="${APP_PATH}/${APP_NAME}"
SERVICE_FILE="/etc/systemd/system/${APP_NAME}.service"

# 输出格式化函数
info() { echo "[INFO] $*"; }
success() { echo "[SUCCESS] $*"; }
error() { echo "[ERROR] $*" >&2; exit 1; }

# 检查是否以root权限运行
if [ "$(id -u)" -ne 0 ]; then
    error "请使用root权限运行此脚本 (sudo $0)"
fi

# 1. 检查并创建系统用户
info "检查系统用户 ${APP_USER}..."
if ! id -u "${APP_USER}" >/dev/null 2>&1; then
    info "创建用户 ${APP_USER}..."
    useradd -r -s /sbin/nologin "${APP_USER}" || error "创建用户失败"
else
    info "用户 ${APP_USER} 已存在"
fi

# 2. 设置程序文件权限
info "设置程序文件权限..."
if [ ! -f "${APP_BIN}" ]; then
    error "程序文件 ${APP_BIN} 不存在，请先放置程序文件"
fi

# 设置目录和文件所有权
chown -R "${APP_USER}:${APP_GROUP}" "${APP_PATH}" || error "设置文件所有权失败"
chown -R "${APP_USER}:${APP_GROUP}" "${APP_PATH}/data/plugins" || error "设置插件执行权限失败"

# 增加执行权限
chmod +x "${APP_BIN}" || error "设置程序执行权限失败"
success "权限设置完成"

# 3. 配置并启动服务
info "配置服务..."
# 生成服务配置文件(文件内容同go-caipu.service)
cat > "${SERVICE_FILE}" << EOF
[Unit]
Description=Go-Caipu web admin
Documentation=https://doc.gocpu.cn  # 项目文档地址
After=network.target  # 网络服务启动后再启动本服务

[Service]
# 运行用户，建议使用非root用户提高安全性
User=caipu
Group=caipu

# 程序路径，根据你的实际部署路径调整
ExecStart=/app/go-caipu

# 工作目录
WorkingDirectory=/app

# 环境变量设置，可以根据需要添加
Environment="PORT=80"

# 当程序异常退出时自动重启
Restart=always
RestartSec=10  # 重启间隔时间（秒）

# 限制程序的资源使用（可选）
LimitNOFILE=4096

# 日志配置
StandardOutput=journal
StandardError=journal
SyslogIdentifier=go-caipu

[Install]
WantedBy=multi-user.target  # 多用户模式下启动

EOF

# 重新加载配置并启动服务
systemctl daemon-reload || error "重新加载systemd配置失败"

if systemctl is-active --quiet "${APP_NAME}"; then
    info "重启服务..."
    systemctl restart "${APP_NAME}" || error "重启服务失败"
else
    info "启动服务并设置开机自启..."
    systemctl start "${APP_NAME}" || error "启动服务失败"
    systemctl enable "${APP_NAME}" || error "设置开机自启失败"
fi

# 4. 检查服务状态
info "检查服务状态..."
if systemctl is-active --quiet "${APP_NAME}"; then
    success "${APP_NAME} 服务运行正常"
    systemctl status "${APP_NAME}" --no-pager
else
    error "${APP_NAME} 服务启动失败"
    journalctl -u "${APP_NAME}" -n 20 --no-pager
fi

success "部署完成"
